<?php
namespace Home\Model;
use Home\Service\Wechat; 
use Home\Service\CommonInfo;
use Home\Service\BiaoQing;
use Home\Logic\SUB01;
use Home\Logic\SUB02; 
use Org\Net\IpLocation;
use Think\Model;
class WeixinModel 
{
    private $weixin;
    public function __construct($options){
        $options=array(
            'appid'=>C("appid"),//'wx58f474eee20d6732', //填写高级调用功能的app id
            'appsecret'=>C("appsecret"),//'316dd17412c13d4549609f2af6d74385', //填写高级调用功能的密钥
            'weixinhao'=>C("weixinhao"),//"gh_86b7d274b2e9",
            'token'=>C("token"),//'weiphp', //填写你设定的key
        );
       $this->weixin=new Wechat($options);
    }
    /**
     * 获取参数
     * @return \Home\Service\Wechat
     */
    public function getweixin(){
        return $this->weixin;
    }
    /**
     * 微信交互
     */
    public function run() {
        //效验签名
        //$this->valid();
        //获取来源信息
        $type = $this->weixin->getRev()->getRevType();
        //根据来源信息的类型使用不同的方法路径进行处理
        switch($type) {
            case Wechat::MSGTYPE_TEXT:
                $this->onText();
                break;
            case Wechat::MSGTYPE_VOICE:
                $this->onVoice();
                break;
            case Wechat::MSGTYPE_EVENT:
                $event=$this->weixin->getRevEvent() ;
                switch ($event["event"]) {
                    case 'subscribe':
                        $this->onSubscribe();
                        break;
                    case 'unsubscribe':
                        $this->onUnsubscribe();
                        break;
                    case 'CLICK':
                        $this->onClick($event["key"]);
                        break;
                }
                break;
            case Wechat::MSGTYPE_IMAGE:
                $this->onImage();
                break;
            case Wechat::MSGTYPE_LOCATION:
                $this->onLocation();
                break;
            default:
                $this->weixin->text("help info")->reply();
        }
    
    }
    
    /**
     * 收到文本消息时触发，回复收到的文本消息内容
     *
     * @return void
     */
    protected function onText() {
        $tousername = $this->weixin->getRevTo() ;
        $fromusername = $this->weixin->getRevFrom() ;
        $keyword = $this->weixin->getRevContent() ;
        switch($tousername){
            case SUB_ID0:   // 正式公众号（ToUserName）的分支处理
                //先实例化一个表情处理对象，然后调用这个对象中的表情处理函数
                $biaoqingObj = new BiaoQing();
                $keyword = $biaoqingObj->biaoqing($keyword); //表情处理
                //调用小九机器人回复文字消息，先加时间标记
                $keyword = $keyword.date("Y-m-d:H:i:s",time());
                //$reply = xiaojo($keyword,$fromusername,$tousername);   //调用 reply_SUB01 的方法来处理分支1
                /**
                $tpl01 = '收到12' ; //提示信息
                $tpl02 = '发来的文字消息：' ; //提示信息
                $reply = $tousername. $tpl01 .$fromusername.$tpl02.$keyword ;  //处理后的回复内容
                //$this->responseMsg( $reply );
                **/
                
                if($keyword=="ucenter"){
                    $items["Title"] ="用户中心";
                    $items["Description"] ="查看用户中心";
                    $items["PicUrl"] =C("host")."/Public/img/default.jpg";
                    $items["Url"] =C("host"). U('User/cen',array("openid"=>$fromusername));
                    //回复单图文
                    $this->weixin->news(array($items ))->reply();
                    exit();
                }
                if($keyword=="yaoqing"){
                    $items["Title"] ="邀请好友";
                    $items["Description"] ="邀请好友赚钱";
                    $items["PicUrl"] =C("host")."/Public/img/default.jpg";
                    $items["Url"] =C("host"). U('User/yao',array("openid"=>$fromusername));
                    //回复单图文
                    $this->weixin->news(array($items ))->reply();
                    exit();
                }
                if($keyword=="chaxun"){
                    $items["Title"] ="查询账户";
                    $items["Description"] ="收入查询";
                    $items["PicUrl"] =C("host")."/Public/img/default.jpg";
                    $items["Url"] =C("host"). U('User/shou',array("openid"=>$fromusername));
                    //回复单图文
                    $this->weixin->news(array($items ))->reply();
                    exit();
                }//zhuanqian
                if($keyword=="zhuanqian"){
                    $items["Title"] ="我要赚钱";
                    $items["Description"] ="我要赚钱";
                    $items["PicUrl"] =C("host")."/Public/img/default.jpg";
                    $items["Url"] =C("host"). U('Zhuan/index',array("openid"=>$fromusername));
                    //回复单图文
                    $this->weixin->news(array($items ))->reply();
                }
                if($keyword=="帮助"||$keyword=="help"){
                    $this->weixin->text("输入自己淘客ID@邀请好友的淘客ID即可立即兑换积分邀请好友的积分。")->reply();
                }
                //$sd=strstr($haystack, $needle);
                exit;
            case SUB_ID1:   // 测试号1（ToUserName）的分支处理
                $SUB01 = new SUB01();
                $reply = $SUB01->reply_SUB01($keyword,$fromusername,$tousername);   //调用 reply_SUB01 的方法来处理分支1
                $this->responseMsg( $reply );
                exit;
            case SUB_ID2:   // 测试号2（ToUserName）的分支处理
                $SUB02 = new SUB02();
                $reply = $SUB02->reply_SUB02($keyword,$fromusername,$tousername);   //调用 reply_SUB01 的方法来处理分支1
                $this->responseMsg( $reply );
                exit;
            default: //如果是其他公众号则调用 默认回复
                //默认的处理过程
                //$keyword = $this->getRevContent() ;
                //默认的处理过程
                $tpl01 = '收到' ; //提示信息
                $tpl02 = '发来的文字消息：' ; //提示信息
                $reply = $tousername. $tpl01 .$fromusername.$tpl02.$keyword ;  //处理后的回复内容
                //默认的处理内容结束
                $this->weixin->text($reply)->reply();
                exit;
        }
    
    }
    
    
    /**
     * 收到语音消息时触发，回复语音识别结果(需要开通语音识别功能)
     *
     * @return void
     */
    protected function onVoice() {
        //取参数
        $tousername = $this->weixin->getRevTo() ;
        $fromusername =$this->weixin->getRevFrom() ;
        $Recognition = $this->weixin->getRevVoice();
    
        //根据 ToUserName 的不同调用不同的回复函数，默认回复文字信息
        switch($tousername){
            case SUB_ID0:   // 正式公众号（ToUserName）的分支处理
            case SUB_ID1:   // 测试号1（ToUserName）的分支处理
            case SUB_ID2:   // 测试号2（ToUserName）的分支处理
                $reply = array(
                "title" =>  get_utf8_string("你好"),
                "description" =>  get_utf8_string("亲爱的主人"),
                "murl" =>  get_utf8_string("http://weixen-file.stor.sinaapp.com/b/xiaojo.mp3"),
                "hqurl" =>  get_utf8_string("http://weixen-file.stor.sinaapp.com/b/xiaojo.mp3"),
                );
                $this->weixin->music($reply ['title'], $reply ['description'], $reply ['murl'], $reply ['hqurl']) ;
                break;
            default: //如果是其他公众号则调用 默认回复
                $this->weixin->text('收到了语音消息,识别结果为：' );
                break;
        }
    
    }
    
    
    /**
     * 收到图片消息时触发，回复由收到的图片组成的图文消息
     *
     * @return void
     */
    protected function onImage() {
    
        //取参数
        $tousername = $this->weixin->getRevTo() ;
        $fromusername =$this->weixin->getRevFrom() ;
        $PicUrl =$this->weixin->getRevPic() ;
    
        //根据 ToUserName 的不同调用不同的回复函数，默认回复文字信息
        switch($tousername){
            case SUB_ID0:   // 正式公众号（ToUserName）的分支处理
                $reply = urldecode(xiaojo("&".$PicUrl,$fromusername,$tousername));
                //统一的回复信息 方法
                $this->responseMsg( $reply );
                exit;
            case SUB_ID1:   // 测试号1（ToUserName）的分支处理
            case SUB_ID2:   // 测试号2（ToUserName）的分支处理
            default: //如果是其他公众号则调用 默认回复
                $keyword = "图片信息 处理未实现";
                //默认的处理过程
                $tpl01 = '收到' ; //提示信息
                $tpl02 = '发来的图片信息：' ; //提示信息
                $reply = $tousername. $tpl01 .$fromusername.$tpl02.$keyword ;  //处理后的回复内容
                //默认的处理内容结束
                $this->weixin->text($reply)->reply();
                exit;
        }
    
    }
    
    /**
     * 收到地理位置消息时触发，回复收到的地理位置
     *
     * @return void
     */
    protected function onLocation() {
    
        //取参数
        $tousername = $this->weixin->getRevTo() ;
        $fromusername = $this->weixin->getRevFrom() ;
        $location =$this->weixin->getRevGeo();
        $keyword = 'x@' . $location[x] . '@' . $location[y];
    
        //根据 ToUserName 的不同调用不同的回复函数，默认回复文字信息
        $reply = '' ;       //默认的回复内容
        switch($tousername){
            case SUB_ID0:   // 公众号（ToUserName）的分支处理
                $keyword = urlencode(str_replace('\.','\\\.',$keyword));
                $reply = urldecode(xiaojo($keyword,$fromusername,$tousername));
                break;
            case SUB_ID1:   // 测试号1（ToUserName）的分支处理
                $SUB01 = new SUB01();
                $reply = $SUB01->reply_SUB01($keyword,$fromusername,$tousername);   //调用 reply_SUB01 的方法来处理分支1
                break;
            case SUB_ID2:   // 测试号2（ToUserName）的分支处理
                $SUB02 = new SUB02();
                $reply = $SUB02->reply_SUB02($keyword,$fromusername,$tousername);   //调用 reply_SUB012的方法来处理分支1
                break;
            default: //如果是其他公众号则调用 默认回复
                //默认的处理过程
                $tpl01 = '收到' ; //提示信息
                $tpl02 = '发来的位置消息：' ; //提示信息
                $keyword = "图片信息 处理未实现";
                $reply = $tousername. $tpl01 .$fromusername.$tpl02.$keyword ;
                //处理后的回复内容
                //默认的处理内容结束
                $this->weixin->text($reply)->reply();
                exit;
        }
    
        //统一的回复信息 方法
        $this->responseMsg( $reply );
         
    }
    
    
    
    /**
     * 用户关注时触发，回复「欢迎关注」
     *
     * @return void
     */
    protected function onSubscribe() {
        $tousername = $this->weixin->getRevTo() ;
        $fromusername =$this->weixin->getRevFrom() ;
        $this->weixin->getRev();
        $model=M("client");
        $list=$model->where(array("openid"=>$fromusername))->find();
        if($list){
           $list["time"]=time();
           $list["times"]=date("Y-m-d:H:i:s",time());
           $userinfo=$this->weixin->getUserInfo($fromusername);
           if(empty($list["headimgurl"])){
               $list["headimgurl"]=$userinfo["headimgurl"];
           }
           if(!isset($userinfo["nickname"])|| empty($userinfo["nickname"])){
               $list["nickname"]="未设置";
           }else{
               $list["uname"]=$userinfo["nickname"];
           }
           $model->where(array("openid"=>$fromusername))->data($list)->save();
           M("log")->data(
               array("info"=>json_encode($list),
               "times"=>date("Y-m-d H:i:s",time()),
               "openid"=>$fromusername,
               "event"=>"关注"
               ))->add();
        }else{
            $userinfo=$this->weixin->getUserInfo($fromusername);
                M("log")->data(array("info"=>json_encode($userinfo),
                    "times"=>date("Y-m-d H:i:s",time()),
                    "openid"=>$fromusername,
                    "event"=>"关注"
                )
            )->add();
            if(!isset($userinfo["nickname"])|| empty($userinfo["nickname"])){
                $userinfo["nickname"]="未设置";
            }
            if(!isset($userinfo["headimgurl"])|| empty($userinfo["headimgurl"])){
                $userinfo["headimgurl"]="";
            }
            $data=array(
                "openid"=>$fromusername,
                "time"=>time(), 
                "times"=>date("Y-m-d:H:i:s",time()),
                "uname"=>$userinfo["nickname"],
                "status"=>1,
                "headimg"=>$userinfo["headimgurl"]
            );
            M("client")->data($data)->add();
        }
       $str="欢迎关注淘金币";
       $this->weixin->text($str)->reply();
    }
    
    /**
     * 用户取消关注时触发
     *
     * @return void
     */
    protected function onUnsubscribe() {
        $this->weixin->text('欢迎你再回来！')->reply();
    }
    /**
     * 获取用户详细信息
     * @param unknown $openid
     * @return Ambigous <multitype:, boolean, mixed>
     */
    public function getUserInfo($openid){
       return  $this->weixin->getUserInfo($openid);
    }
    /**
     * 收到自定义菜单消息时触发，回复菜单的EventKey
     *
     * @return void
     */
    protected function onClick($key) {
        $tousername = $this->weixin->getRevTo() ;
        $fromusername =$this->weixin->getRevFrom() ;
        $this->weixin->getRev();
       if($key=="kefu"){
           $lx=M("lx");
           $lxfx=$lx->find(1);
           if($lx){
             $this->weixin->text("请联系我们的\nQQ:".$lxfx["qq"]."\n Tel:".$lxfx["phone"])->reply();
           }else{
            $this->weixin->text("请联系我们的\nQQ:".C("KefuQQ")."\nTel:".C("Tel"))->reply();
           }
       }else if($key=="ucenter"){
                $items["Title"] ="用户中心";
                $items["Description"] ="查看用户中心";
                $items["PicUrl"] =C("host")."/Public/img/ucenter.png";
                $items["Url"] =C("host"). U('User/cen',array("openid"=>$fromusername));
                //回复单图文
                $this->weixin->news(array($items ))->reply();
                exit();
       }else if($key=="yaoqing"){
           $items["Title"] ="邀请好友";
           $items["Description"] ="邀请好友赚钱";
           $items["PicUrl"] =C("host")."/Public/img/yaoqing.png";
           $items["Url"] =C("host"). U('User/yao',array("openid"=>$fromusername));
           //回复单图文
           $this->weixin->news(array($items ))->reply();
           exit();
       }elseif($key=="chaxun"){
           $items["Title"] ="查询账户";
           $items["Description"] ="收入查询";
           $items["PicUrl"] =C("host")."/Public/img/chaxun.png";
           $items["Url"] =C("host"). U('User/shou',array("openid"=>$fromusername));
           //回复单图文
           $this->weixin->news(array($items ))->reply();
           exit();
       }//zhuanqian
       elseif($key=="zhuanqian"){
           $items["Title"] ="我要赚钱";
           $items["Description"] ="我要赚钱";
           $items["PicUrl"] =C("host")."/Public/img/makemoney.png";
           $items["Url"] =C("host"). U('Zhuan/index',array("openid"=>$fromusername));
           //回复单图文
           $this->weixin->news(array($items ))->reply();
           exit();
       }else{
           $this->weixin->text('欢迎你！')->reply();
       }
    }
    /**
     * 用户回复信息时触发，根据回复的信息类型，选用合适的回复
     *如果是不是数组，则直接调用文字格式回复
     *如果是数组，则判断数组中是否包含 murl,如果有，用音乐格式回复
     * 如果是数组，则判断数组中是 不包含 murl,如果有，用图文格式回复，单图
     *
     * @param  string  $msg    需要回复的消息内容
     * @return void
     */
    protected function responseMsg($msg) {
    
        if (!is_array($msg))
        {
            $this->weixin->text($msg)->reply();    // 如果不是数组，回复文字格式
        }
        elseif(array_key_exists("murl",$msg))     //如果数组中包含murl，则回复音乐格式
        {
            $this->weixin->music($msg ['title'], $msg ['description'], $msg ['murl'], $msg ['hqurl'] )->reply();
        }else{
            if (isset($msg['title'])){           //单条数组的情况
                $items["Title"] = $msg["title"];
                $items["Description"] = $msg["description"];
                $items["PicUrl"] = $msg["pic"];
                $items["Url"] = $msg["url"];
                //回复单图文
                $this->weixin->news(array($items ))->reply();
            }else{  //多条的时候
                $items = array();
                foreach ($msg as $value){
                    $item_tmp["Title"] = $value["title"];
                    $item_tmp["Description"] = $value["description"];
                    $item_tmp["PicUrl"] = $value["pic"];
                    $item_tmp["Url"] = $value["url"];                 
                    $items = array_merge($items,array($item_tmp));
                }
                $this->weixin->news($items )->reply();
            }
        }
    }
}

?>